/**
 * 转换为可写的值
 *
 * 参考资料
 * https://juejin.cn/post/7074461717706571784
 */
type CanWrite<T> = {
  -readonly [K in keyof T]: T[K];
};

/**
 * 字面量类型转换为基础类型
 * @author chatGPT
 */
type LiteralToBase<T> = T extends string
  ? string
  : T extends number
  ? number
  : T extends boolean
  ? boolean
  : T extends null
  ? null
  : T extends undefined
  ? undefined
  : T extends symbol
  ? symbol
  : T;

/** 值生成为类型 */
type ValueToType<T> = {
  [K in keyof T]: LiteralToBase<T[K]>;
};

/** 生成为可用的类型 可选字段类型
 * @description
 * - 从只读变成可编写
 * - 作为入参值 变成可选的
 * - 字面量类型转换为基础类型
 */
export type ToTypes<T> = ValueToType<Partial<CanWrite<T>>>;
